// Copyright (C) 2023 即时通讯网(52im.net) & Jack Jiang.
// The RainbowChat Project. All rights reserved.
// 
// 【本产品为著作权产品，合法授权后请放心使用，禁止外传！】
// 【本次授权给：<北京小羊驼科技有限公司>，授权编号：<NT231212144350>，代码指纹：<A.702363430.550>，技术对接人微信：<ID: wxid_wbyootvkdcgj22>】
// 【授权寄送：<收件：苏先生、地址：北京市大兴区北京密码西区6号楼1单元301、电话：18613885610、邮箱：bd@huiyuanxiang-inc.com>】
// 
// 【本系列产品在国家版权局的著作权登记信息如下】：
// 1）国家版权局登记名(简称)和权证号：RainbowChat    （证书号：软著登字第1220494号、登记号：2016SR041877）
// 2）国家版权局登记名(简称)和权证号：RainbowChat-Web（证书号：软著登字第3743440号、登记号：2019SR0322683）
// 3）国家版权局登记名(简称)和权证号：RainbowAV      （证书号：软著登字第2262004号、登记号：2017SR676720）
// 4）国家版权局登记名(简称)和权证号：MobileIMSDK-Web（证书号：软著登字第2262073号、登记号：2017SR676789）
// 5）国家版权局登记名(简称)和权证号：MobileIMSDK    （证书号：软著登字第1220581号、登记号：2016SR041964）
// * 著作权所有人：江顺/苏州网际时代信息科技有限公司
// 
// 【违法或违规使用投诉和举报方式】：
// 联系邮件：jack.jiang@52im.net
// 联系微信：hellojackjiang
// 联系QQ号：413980957
// 授权说明：http://www.52im.net/thread-1115-1-1.html
// 官方社区：http://www.52im.net
package com.x52im.mall.logic.shop;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import com.eva.android.widget.DataLoadableActivity;
import com.eva.android.widget.AListAdapter2;
import com.eva.android.widget.Action;
import com.eva.android.widget.WidgetUtils;
import com.eva.epc.common.util.CommonUtils;
import com.eva.framework.dto.DataFromServer;
import com.x52im.mall.IntentFactory;
import com.x52im.mall.MallGlobal;
import com.x52im.mall.ObjectFactory;
import com.x52im.mall.Utility;
import com.x52im.mall.shop.dto.Device;
import com.x52im.mall.shop.dto.SODetail;
import com.x52im.rbchat.R;

import java.util.ArrayList;

/**
 * 购物车Activity实现类.
 * 
 * @author Jack Jiang(http://www.52im.net/space-uid-1.html)
 * @version 1.0
 */
public class ShopCarActivity extends DataLoadableActivity 
{
	@SuppressWarnings("unused")
	private final static String TAG = ShopCarActivity.class.getSimpleName();
	
	/** 标签组件：商品总价货币类型 */
	private TextView viewAmountCurrency = null;
	/** 标签组件：商品总价 */
	private TextView viewAmount = null;
	/** 按钮组件：结算 */
	private Button btnSettlement = null;
	
	/** 明细列表 */
	private ListView listView;
	/** 明细列表Adapter */
	private DetailListAdapter listAdapter;
	
	private ViewGroup layoutForNoGoods = null;
	private ViewGroup layoutForHasGoods = null;
	
	private Button delBtn = null;
	private View backBtn = null;
	
	/** 
	 * 初始化界面组件.
	 * {@inheritDoc}
	 */
	@Override
	protected void initViews(Bundle savedInstanceState)
	{
		// 养成良好习惯：首先设置主layout，确保后绪的操作中使用到的组件都可以被find到
		setContentView(R.layout.common_mall_shop_layout_shop_car);
		
//		this.getCustomeTitleBar().getRightGeneralButton().setVisibility(View.VISIBLE);
//		this.getCustomeTitleBar().getRightGeneralButton().setText("");
//		this.getCustomeTitleBar().getRightGeneralButton().setBackgroundResource(R.drawable.common_mall_shop_layout_shopcar_delbtn);
//		
		delBtn = (Button)findViewById(R.id.common_mall_shopcar_delbtn);
		backBtn = findViewById(R.id.common_mall_shop_car_back);
		// 初始化各种组件
		viewAmountCurrency = (TextView)findViewById(R.id.common_mall_layout_shopcar_amountCurrentcyView);
		viewAmount = (TextView)findViewById(R.id.common_mall_layout_shopcar_amountView);
		btnSettlement = (Button)findViewById(R.id.common_mall_layout_shopcar_settlementBtn);
		listView = (ListView) findViewById(R.id.common_mall_layout_shopcar_listView);
		layoutForNoGoods = (ViewGroup)findViewById(R.id.common_mall_shop_layout_shop_car_noGoodsLL);
		layoutForHasGoods = (ViewGroup)findViewById(R.id.common_mall_shop_layout_shop_car_goodsLL);
		listAdapter = new DetailListAdapter(this);
		listView.setAdapter(listAdapter);
		// 刷新列表ui一下（要不然默认因为没有列表数据的话，layoutForNoGoods就不能及时地被Visible）
		listAdapter.notifyDataSetChanged();
		
		//
		this.setLoadDataOnCreate(false);
		
		//** 默认货币类型显示
		viewAmountCurrency.setText(Utility.DEFAULT_CURRENCY_TYPE_NAME);
		// ** 说明：列表的数据在初始化时是不会调用 notifyDataSetChanged()方法的，所以在
		// **     初始化时显示调用一下，否则在初始化时界面上的商品总额是不会被更新上去的
		// 当列表中的数据模型发生改变时要调用的方法
		listDataOnChanged(MallGlobal.getMallProviderInstance(this).getRobotimeMall().getShopCarProvider().getGoodsAmount());
	}
	
	/**
	 * 当本列表中的数据发生改变时（通常是数量发生了改变）要调用的方法.
	 * 
	 * @param goodsAmount 当前购物车中（也即是当前订单明细）的总金额
	 */
	protected void listDataOnChanged(double goodsAmount)
	{
		viewAmount.setText(String.valueOf(goodsAmount));
	}
	
	@Override
	protected void initListeners()
	{
		btnSettlement.setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View v)
			{
				startActivity(IntentFactory.createOrderComfirmActivityIntent(ShopCarActivity.this));
			}
		});
		
		backBtn.setOnClickListener(new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				ShopCarActivity.this.finish();
			}
		});
		
	}
	
//	// 去掉EVA通用类中的默认“返回”菜单项
//	public boolean onCreateOptionsMenu(Menu menu)
//	{
//		return false;
//	}
	
	@Override
	protected void onResume()
	{
		super.onResume();
		// 在界面再次出现时刷新列表，解决当从购物车生成订单后又返回购物车时，数
		// 据模型虽清空但列表还未刷新就会错误地把上次的购物车内容显示出来，这就不对了！
		listAdapter.notifyDataSetChanged();
	}

	//--------------------------------------------------------------------------------------------
	/**
	 * 从服务端查询数据并返回.
	 * 
	 * @param params loadData中传进来的参数，本类中该参数没有被用到
	 */
	@Override protected DataFromServer queryData(String... params)
	{
		return null;
	}
	//将已构造完成的完整的明细数据放入列表中显示出来
	@Override protected void refreshToView(Object dateToView)
	{
		//
	}
	
	/**
	 * 自定义明细列表的adapter类实现.
	 * 
	 * <p>
	 * item的数量不支持直接编辑，因为要监听它的文本改事件（TextWatch）时，会在列表的
	 * 数据更新、notifyDatasetChacned()等时机产生错乱，所以目前就取消了文本框内容的直
	 * 接编辑，以后或许可以考虑通过像DMKX里样弹出一个单独的面板。目前只能通过加、减按
	 * 钮实现数量的更改。
	 */
	private class DetailListAdapter extends AListAdapter2<SODetail>
	{
		/** 本值用于记住正在修改中的列表明细行索引值 */
		private int loction;

		/** 记录选中的ListView的行索引值以备后用（目前是在：单击、长按2类事件中保存了此索引值）.*/
		protected int selectedListViewIndex = -1;
		
		public DetailListAdapter(Activity context)
		{
			super(context, R.layout.common_mall_shop_layout_shop_car_list_item);
		}

		//重写本方法，以便使用自定义的列表数据模型：使用全局静态变量，目的是无论Ui如何变化都保留上次的查询结果，
		//以方便用户查看，提高用户体验，这对查询类的功能比较有用哦。另注：AListAdapter里的列表数据模型列象名就是listData，
		//所以本类里要使用自已的对象则再也不能用listData哦，否则本方法里将错误地引用于AListAdapter里的listData
		//从而导致空指针异常（之前就是碰到了这样的问题，让人百思不得其解）.
		@Override//本方法只在父类AListAdapter的构造方法里被调用一次，所以一定要注意staticListData被实例化的时机
		protected ArrayList<SODetail> createListData()
		{
			//注意：不能使用与AListAdapter里默认的数据模型listData一样的名字哦，否则将错误地引用父类该对象从而导致空指针
			return MallGlobal.getMallProviderInstance(context).getRobotimeMall().getShopCarProvider().getGoodsInCar();
		}

		@Override
		public View getView(final int position, View convertView, ViewGroup parent)
		{
			//列表item上的：商品图片
			ImageView viewGoodPic = null;
			//列表item上的：商品简称
			TextView viewGoodName = null;
			//列表item上的：商品描述
			TextView viewGoodDesc = null;
			//列表item上的：订购数据
			EditText viewQuantity = null;
			//列表item上的：订购价格货币类型
			TextView viewPriceCurrency = null;
			//列表item上的：订购价格
			TextView viewPrice = null;
			//列表item上的：订购金额货币类型
			TextView viewAmountCurrency = null;
			//列表item上的：订购金额小计
			TextView viewTotalAmount = null;
			//列表item上的：商品的颜色
			TextView viewGoodColorDesc = null;
			//列表item上的：增加按钮 
			View btnAdd = null;
			//列表item上的：减少按钮 
			View btnReduce = null;
			//列表item上的：删除 
			Button btnDelete = null;
			//列表item上的：目标性别 
			TextView viewForSex = null;

			//---------------------------------------------------------------------------------------- （1）UI初始化
			//当的item布局实例已经存在（不在存，意味着这个item刚好从不可见区移到可见区时）
			//** 根据android的列表ui实现，为了节比资源占用，假如列表有100行而可见区显示5行，那么任何时候
			//** 这个列表中只会有5个item的UI存在，其它的item都是当被转到可见区时自动把自
			//** 已的数据实时地更新列UI上，以便查看，也就是说item的UI并不是与后台数据一
			//** 一对应的，所以正如API文档里说的，convertView并不能确保它总能按你的想法保持不为null
			boolean needCreateItem = (convertView == null);
			//正在操作的列表行的数据集
			final SODetail rowData = listData.get(position);
			if (needCreateItem)
				//明细item的UI实例化
				convertView = layoutInflater.inflate(itemResId, null);

			//item里的操作组件实例
			viewGoodPic = (ImageView) convertView.findViewById(R.id.common_mall_shop_layout_shopcar_good_item_goodPicView);
			viewGoodName = (TextView) convertView.findViewById(R.id.common_mall_shop_layout_shopcar_good_item_goodNameView);
			viewGoodDesc = (TextView) convertView.findViewById(R.id.common_mall_shop_layout_shopcar_good_item_goodDescView);
			viewQuantity = (EditText) convertView.findViewById(R.id.common_mall_shop_layout_shopcar_good_item_quantityEdit);
			viewPriceCurrency = (TextView) convertView.findViewById(R.id.common_mall_shop_layout_shopcar_good_item_priceCurrencyView);
			viewPrice = (TextView) convertView.findViewById(R.id.common_mall_shop_layout_shopcar_good_item_priceView);
			viewAmountCurrency = (TextView) convertView.findViewById(R.id.common_mall_shop_layout_shopcar_good_item_amountCurrencyView);
			viewTotalAmount = (TextView) convertView.findViewById(R.id.common_mall_shop_layout_shopcar_good_item_amountView);
			viewGoodColorDesc = (TextView) convertView.findViewById(R.id.common_mall_shop_layout_shopcar_good_item_colorDescView);
			btnAdd = convertView.findViewById(R.id.common_mall_shop_layout_shopcar_good_item_quantityPlusBtn);
			btnReduce = convertView.findViewById(R.id.common_mall_shop_layout_shopcar_good_item_quantityReduceBtn);
			btnDelete = (Button) convertView.findViewById(R.id.common_mall_shop_layout_shopcar_good_item_delBtn);
			viewForSex = (TextView) convertView.findViewById(R.id.common_mall_shop_layout_shopcar_good_item_forSexView);

			//---------------------------------------------------------------------------------------- （2）增加事件处理器
			//各操作组件的事件监听器只需要在convertView被实例化时才需要重建（convertView需要被实例化
			//当然就意味着它上面的所有操作组件都已经重新新建了）
			//** 关于事件处理器的说明：事件处理器的增加其实可以不这么麻烦，直接每getView一次就给组件new一个处理器，
			//** 这样做的好处是简单，但显然存在资源浪费（每刷新一次view就新建监听器）。而现在的实现就跟Android的列表
			//** 实现原理一样，在切换到下一组item前，监听器永远只有一屏item的数量（刷新时只需要即时刷新对应item的数据到
			//** 它的监听器里），这样就节省了资源开销！
			if(needCreateItem)
			{
//				//*** 为数量文本框增加监听器
//				EditQuantityTextWatcher editListen = new EditQuantityTextWatcher();
//				viewQuantity.addTextChangedListener(editListen);
//				viewQuantity.setTag(editListen);

				//*** 为加减快捷按钮增加监听器
				ChangeQuantityClickListener addListen = new ChangeQuantityClickListener(viewQuantity, 1);
				btnAdd.setOnClickListener(addListen);
				btnAdd.setTag(addListen);
				//*** 
				ChangeQuantityClickListener reduceListen = new ChangeQuantityClickListener(viewQuantity, -1);
				btnReduce.setOnClickListener(reduceListen);
				btnReduce.setTag(reduceListen);
				//*** 
				DeleteOnClickListener deleteLIstener = new DeleteOnClickListener();
				btnDelete.setOnClickListener(deleteLIstener);
				btnDelete.setTag(deleteLIstener);
			}

			//---------------------------------------------------------------------------------------- （3）
			//给标签设置值，以供用户查看
			//				viewTitle.setText(rowData.getTitle());
			Device d = MallGlobal.getMallProviderInstance(context).getRobotimeMall().getGoodsProvider().getDeviceById(rowData.getDevice_id());
			viewGoodPic.setImageResource(Utility.getDefaultGoodPreviewIconRes(d.getDevice_short_name()));
			viewGoodName.setText(d.getDevice_short_name());
			viewGoodDesc.setText(d.getDevice_desc());
			viewQuantity.setText(rowData.getPurchase_quantity());
			viewPriceCurrency.setText(Utility.DEFAULT_CURRENCY_TYPE_NAME);
			viewPrice.setText(rowData.getPurchase_price());
			viewAmountCurrency.setText(Utility.DEFAULT_CURRENCY_TYPE_NAME);
			viewTotalAmount.setText(rowData.getPurchase_amount());
			viewGoodColorDesc.setText(rowData.getColor_desc());
			viewForSex.setText(String.valueOf(ObjectFactory.createForSexRenderer(ShopCarActivity.this).getNameById(d.getFor_sex())));

			//** 确保每次item被刷新时都更新操作组件事件监听器中要记录的该item所对应的 列表的行索引号
			//** 这样就能很好地确保行索引号的正确性了
//			EditQuantityTextWatcher editListener = (EditQuantityTextWatcher) viewQuantity.getTag();
//			editListener.setPosition(position);
			ChangeQuantityClickListener reduceListener = (ChangeQuantityClickListener) btnReduce.getTag();
			reduceListener.setPosition(position);
			ChangeQuantityClickListener addListen = (ChangeQuantityClickListener) btnAdd.getTag();
			addListen.setPosition(position);
			DeleteOnClickListener deleteListener = (DeleteOnClickListener) btnDelete.getTag();
			deleteListener.setPosition(position);

			return convertView;
		}

		@SuppressWarnings("unused")
		public int getSelectedListViewIndex()
		{
			return selectedListViewIndex;
		}
		@SuppressWarnings("unused")
		public void setSelectedListViewIndex(int selectedListViewIndex)
		{
			this.selectedListViewIndex = selectedListViewIndex;
//			this.notifyDataSetChanged();
		}
		
		@Override
		public void notifyDataSetChanged()
		{
			super.notifyDataSetChanged();

			// 当列表中的数据模型发生改变时要调用的方法
			listDataOnChanged(MallGlobal.getMallProviderInstance(context).getRobotimeMall().getShopCarProvider().getGoodsAmount());
			
			//
			if(this.getCount() <= 0)
			{
				layoutForNoGoods.setVisibility(View.VISIBLE);
				layoutForHasGoods.setVisibility(View.GONE);
				delBtn.setVisibility(View.GONE);
			}
			else
			{
				delBtn.setVisibility(View.VISIBLE);
//				delBtn.setText("");
//				delBtn.setBackgroundResource(R.drawable.common_mall_shop_layout_shopcar_delbtn);
				layoutForNoGoods.setVisibility(View.GONE);
				layoutForHasGoods.setVisibility(View.VISIBLE);
				
				delBtn.setOnClickListener(new OnClickListener()
				{
					
					@Override
					public void onClick(View v)
					{
						WidgetUtils.areYouSure(layoutInflater.getContext(), $$(R.string.common_mall_shop_shop_car_sure_delete_all), new Action() {
							@Override 
							public void actionPerformed(Object obj){
								for(int i = listData.size() - 1; i > -1; i--)
								{
									removeItem(i);
								}
							}
						});
					}
				});
				
			}
		}
		
		/**
		 * 删除按钮事件监听器.
		 */
		private class DeleteOnClickListener implements View.OnClickListener
		{
			int position = 0;

			public void setPosition(int position)
			{
				this.position = position;
			}

			@Override
			public void onClick(View v)
			{
				WidgetUtils.areYouSure(layoutInflater.getContext(), $$(R.string.common_mall_shop_shop_car_sure_delete), new Action() {
					@Override public void actionPerformed(Object obj){
						removeItem(position);
					}
				});
			}
		}

		/**
		 * 加减数量按钮监听器.
		 */
		private class ChangeQuantityClickListener implements View.OnClickListener
		{
			private int position = 0;
			private int changeSl = 0;
			private EditText editNumber;

			public ChangeQuantityClickListener(EditText editNumber, int changeSl)
			{
				this.changeSl = changeSl;
				this.editNumber = editNumber;
			}

			public void setPosition(int position)
			{
				this.position = position;
			}

			@Override public void onClick(View v)
			{
				loction = position;
				// 在本次加减操作前的文本中的值
				int text = CommonUtils.getIntValue(editNumber.getText().toString());
				// 本次增减操作后的数量结果
				int result = text + changeSl;
				
				//大于0才更新
				if (result >0)
				{
//					// 把本次加减后的结果设置到数据模型中
					// 设置最新的购买数量到数据模型中
					listData.get(loction).setPurchase_quantity(String.valueOf(result));
					
					// 用模型中新更新完成的数据来刷新UI(此时的UI数量组件上的结果才是本次增减后的真正结果)
					notifyDataSetChanged();
				}
				else
					WidgetUtils.showToast(layoutInflater.getContext(), $$(R.string.common_mall_shop_shop_car_good_list_count_validate), WidgetUtils.ToastType.ERROR);
			}
		}
	}
	
	
}
